import { _decorator, Component, Node, Label, Button, Color, UITransform, Layout, ScrollView, instantiate, Prefab, resources } from 'cc';
import { PlayerStats } from './PlayerStats';
import { PlayerStatsManager } from './PlayerStatsManager';
import { PlayerType } from '../../../battle/Enums';
import { PlayerStatsItem } from './PlayerStatsItem';
import { BattleResultData } from '../../../battle/Model';
import { LOG } from '../../../ConsoleLogCtrl';

const { ccclass, property } = _decorator;

/**
 * 统计面板组件
 * 用于显示玩家统计数据的UI面板
 */
@ccclass('PlayerStatsPanel')
export class PlayerStatsPanel extends Component {
    @property(ScrollView)
    public scrollView: ScrollView = null;

    @property(Node)
    public contentNode: Node = null;

    @property(Prefab)
    public statItemTemplate: Prefab = null;

    @property
    public autoUpdate: boolean = true;

    // 是否显示面板
    private _isVisible: boolean = false;

    // 自动更新定时器
    private _updateTimer: number = null;

    // 统计项目节点缓存
    private _statItem: Node = null;

    // 战斗结果数据
    private _battleResult: BattleResultData = null;

    onLoad() {
        this.initComponents();
        this.hidePanel(); // 默认隐藏面板
    }

    start() {
        if (this.autoUpdate) {
            this.startAutoUpdate();
        }
    }

    /**
     * 初始化组件
     */
    private initComponents() {
        // 初始化内容节点
        if (!this.scrollView) {
            this.scrollView = this.getComponent(ScrollView);
        }
        if (!this.contentNode) {
            this.contentNode = this.scrollView.content;
        }
    }

    /**
     * 显示面板
     */
    public showPanel() {
        this.node.active = true;
        this._isVisible = true;

        // 更新统计数据
        this.displayPlayerStats();

        if (this._battleResult) {
            // 停止自动更新
            this.stopAutoUpdate();
            // 应用战斗结果
            let statItem = this.getStatItem();
            const itemCtrl = statItem.getComponent(PlayerStatsItem);
            if (itemCtrl) {
                itemCtrl.setBattleResult(this._battleResult);
            }
        } else {
            // 只有在没有战斗结果时才启动自动更新
            if (this.autoUpdate) {
                this.startAutoUpdate();
            }
        }
    }

    /**
     * 隐藏面板
     */
    public hidePanel() {
        this.node.active = false;
        this._isVisible = false;

        // 停止自动更新
        this.stopAutoUpdate();
    }

    /**
     * 开始自动更新
     */
    public startAutoUpdate() {
        // 先停止现有的定时器，避免重复启动
        this.stopAutoUpdate();

        // 每秒更新一次
        this._updateTimer = setInterval(() => {
            if (this._isVisible) {
                this.displayPlayerStats();
            }
        }, 1000);
    }

    /**
     * 停止自动更新
     */
    public stopAutoUpdate() {
        if (this._updateTimer) {
            // 停止前再刷一次
            this.displayPlayerStats();
            clearInterval(this._updateTimer);
            this._updateTimer = null;
        }
    }

    /**
     * 获取统计项目Item
     */
    public getStatItem() {
        if (!this.contentNode) return;
        if (!this._statItem){
            let statItem = instantiate(this.statItemTemplate);
            // 添加到内容节点
            this.contentNode.addChild(statItem);
            // 缓存节点
            this._statItem = statItem;
        }
        return this._statItem
    }

    /**
     * 更新显示玩家统计数据
     */
    public displayPlayerStats() {
        if (!this.contentNode) return;

        let statItem = this.getStatItem();

        // 获取玩家统计数据
        const statsManager = PlayerStatsManager.getInstance();
        const allPlayerStats = statsManager.getAllPlayerStats();
        const playerStats = allPlayerStats[0];
        const enemyPlayerStats = allPlayerStats[1];

        // 如果使用模板但需要设置文本
        const itemCtrl = statItem.getComponent(PlayerStatsItem);
        if (itemCtrl) {
            itemCtrl.setPlayerStats(playerStats, enemyPlayerStats);
        }
    }

    /**
     * 清空统计数据显示
     */
    public clearStats() {
        if (!this.contentNode) return;

        // 清空缓存
        this._statItem = null;

        // 移除所有子节点
        this.contentNode.removeAllChildren();
    }

    onDestroy() {
        // 停止自动更新
        this.stopAutoUpdate();

        LOG.log('PlayerStatsPanel: 组件已销毁');
    }

    /**
     * 设置战斗结果到所有PlayerStatsItem
     * @param battleResult 战斗结果数据
     */
    public setBattleResult(battleResult: BattleResultData) {
        // 保存战斗结果数据
        this._battleResult = battleResult;

        // 停止自动更新
        this.stopAutoUpdate();

        // 设置战斗结果
        let statItem = this.getStatItem();
        const itemCtrl = statItem.getComponent(PlayerStatsItem);
        if (itemCtrl) {
            itemCtrl.setBattleResult(battleResult);
        }
    }

    /**
     * 重播开始时调用，重新启动自动更新
     */
    public onReplayStart() {
        // 清除战斗结果数据
        this._battleResult = null;

        // 重播开始时重新启动自动更新
        if (this.autoUpdate && this._isVisible) {
            this.startAutoUpdate();
        }
    }
}